iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

初探後端世界-使用Node.js框架開發網頁系列 第 8

你需要知道的9個元件功能介紹 -7(Interceptor)

  • 分享至 

  • xImage
  •  

interceptor的特點

  1. 在Controller的Handler執行之前/之後產生額外的邏輯
  2. 可以更動資料及拋出Exception
  3. 執行於Middleware之後,Pipe之前

產生interceptor

$ nest g interceptor <INTERCEPTOR_NAME>

interceptor

import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
     //...此處添加想設計的邏輯
    return next.handle();
  }
}

基本骨架解析:

  1. 帶有injectable裝飾器
  2. 實作了NestInterceptor這個介面
  3. 需設計一個intercept方法,裡面有兩個參數:ExecutionContext、CallHandler
  4. retrun CallHandler這個方法所產生的值

什麼是ExecutionContext?

ExecutionContext是繼承ArguementsHost的類別,再多了可以取得Controller相關資訊的功能:

  1. 取得請求對應的Controller類別:getClass( )
  2. 取得請求對應的Controller:getHandler( )

什麼是CallHandler?

  1. CallHandler實作了一個handle( )方法,回傳值是一個rxjs的observable實例,對應的就是該請求的handler處理完回傳的值
  2. 在intercept方法將observable實例回傳,nextjs才能去訂閱它
  3. 我們可以在回傳handle()產生的observable之前擴充邏輯
  4. 因為是obervable,所以也能用Pipe技巧對回傳值或是錯誤進行處理

使用Interceptor

與Exception filter差不多,根據需求分成兩種:
1.只針對單一Handler:添加的@UseInterceptors(<INTERCEPTOR_NAME>)擺放位置在該Handler上

import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import { LoggingInterceptor } from './interceptors/logging/logging.interceptor';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  @UseInterceptors(LoggingInterceptor)
  getHello(): string {
    return this.appService.getHello();
  }
}

2.針對Controller中的所有Handler:@UseInterceptors(<INTERCEPTOR_NAME>)擺放位置在Controller上

import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import { LoggingInterceptor } from './interceptors/logging/logging.interceptor';

@Controller()
@UseInterceptors(LoggingInterceptor)
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

上一篇
你需要知道的9個元件功能介紹 -6(Pipe)
下一篇
你需要知道的9個元件功能介紹 -8(Guard)
系列文
初探後端世界-使用Node.js框架開發網頁12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言